package com.kexio.enterprise.observability.health;

import com.kexio.enterprise.observability.health.checker.HealthChecker;
import com.kexio.enterprise.observability.health.domain.HealthInfo;
import com.kexio.enterprise.observability.health.enums.HealthStatus;
import com.kexio.enterprise.observability.health.listener.HealthStatusListener;
import com.kexio.enterprise.observability.health.result.HealthCheckResult;

import java.util.List;
import java.util.Map;

/**
 * 健康检查服务接口
 * 
 * 提供应用和基础设施的健康检查功能
 * 
 * @author Kexio
 * @since 1.0.0
 */
public interface HealthService {

    /**
     * 获取整体健康状态
     * 
     * @return 健康状态
     */
    HealthStatus getOverallHealth();

    /**
     * 获取详细健康信息
     * 
     * @return 健康信息
     */
    HealthInfo getDetailedHealth();

    /**
     * 检查特定组件的健康状态
     * 
     * @param componentName 组件名称
     * @return 健康状态
     */
    HealthStatus checkComponentHealth(String componentName);

    /**
     * 注册健康检查器
     * 
     * @param name    检查器名称
     * @param checker 健康检查器
     */
    void registerHealthChecker(String name, HealthChecker checker);

    /**
     * 注销健康检查器
     * 
     * @param name 检查器名称
     */
    void unregisterHealthChecker(String name);

    /**
     * 获取所有健康检查器
     * 
     * @return 健康检查器映射
     */
    Map<String, HealthChecker> getAllHealthCheckers();

    /**
     * 执行所有健康检查
     * 
     * @return 健康检查结果
     */
    Map<String, HealthCheckResult> performAllHealthChecks();

    /**
     * 获取健康检查历史
     * 
     * @param componentName 组件名称
     * @param hours        小时数
     * @return 健康检查历史
     */
    List<HealthCheckResult> getHealthHistory(String componentName, int hours);

    /**
     * 设置健康检查间隔
     * 
     * @param componentName 组件名称
     * @param intervalMs    间隔时间（毫秒）
     */
    void setHealthCheckInterval(String componentName, long intervalMs);

    /**
     * 启用/禁用健康检查
     * 
     * @param componentName 组件名称
     * @param enabled       是否启用
     */
    void setHealthCheckEnabled(String componentName, boolean enabled);

    /**
     * 添加健康状态监听器
     * 
     * @param listener 监听器
     */
    void addHealthStatusListener(HealthStatusListener listener);

    /**
     * 移除健康状态监听器
     * 
     * @param listener 监听器
     */
    void removeHealthStatusListener(HealthStatusListener listener);
}
